
package com.ctrip.corp.obt.shard.holder;

import com.ctrip.corp.obt.generic.utils.StringPool;
import com.ctrip.corp.obt.generic.utils.StringUtils;
import com.ctrip.corp.obt.shard.annotation.Permission;
import com.ctrip.corp.obt.shard.context.PermissionContext;
import lombok.Builder;
import lombok.Data;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Permission辅助类
 *
 * @author marco.zheng
 * @since 2022-03-15
 */
public abstract class PermissionHolder {

    /**
     * SQL 解析缓存
     * key 可能是 mappedStatement 的 ID,也可能是 class 的 name
     */
    private static final Map<String, PermissionHolder.PermissionCache> PERMISSION_CACHE = new ConcurrentHashMap<>();

    /**
     * 初始化缓存
     * <p>
     * Mapper#method 上 Permission 注解信息
     *
     * @param method           Method
     */
    public static void initPermissionCache(String mapperClassName, Method method) {
        Permission pageQuery = method.getAnnotation(Permission.class);
        String key = mapperClassName.concat(StringPool.DOT).concat(method.getName());
        if (pageQuery != null) {
            PERMISSION_CACHE.put(key, buildPermissionCache(pageQuery));
        }
    }

    /**
     * 是否进行权限拦截/数据过滤操作
     * @return true 是 false 否
     */
    public static boolean needPermission(String id) {
        return Objects.nonNull(PERMISSION_CACHE.get(id))  || PermissionContext.getOrgIds() != null || PermissionContext.getCorpIds() != null;
    }

    /**
     * 是否精确到组织id进行权限处理
     * @return true 是 false 否
     */
    public static boolean preferOrgPermission() {
        return StringUtils.isNotBlank(PermissionContext.getOrgIds());
    }

    public static PermissionCache getPermission(String id) {
        return PERMISSION_CACHE.get(id);
    }

    private static PermissionHolder.PermissionCache buildPermissionCache(Permission page) {
        return PermissionCache.builder()
                .build();
    }

    @Data
    @Builder
    public static class PermissionCache {

    }

    private PermissionHolder() {}

}
